package lamdba;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

/**
 * Created by 5406160@qq.com on LiBoWen 李博闻.
 *
 * @ClassName : LambdaTest
 * @Author : 54061
 * @Date: 2022/2/25 21:10
 *  * * (形参列表)它就是你要赋值的函数式接口的抽象方法的(形参列表)，照抄
 *  * * {Lambda体}就是实现这个抽象方法的方法体
 *  * * ->称为Lambda操作符（减号和大于号中间不能有空格，而且必须是英文状态下半角输入方式）
 *  *
 *  * 优化：Lambda表达式可以精简
 *  *
 *  * * 当{Lambda体}中只有一句语句时，可以省略{}和{;}
 *  * * 当{Lambda体}中只有一句语句时，并且这个语句还是一个return语句，那么return也可以省略，但是如果{;}没有省略的话，return是不能省略的
 *  * * (形参列表)的类型可以省略
 *  * * 当(形参列表)的形参个数只有一个，那么可以把数据类型和()一起省略，但是形参名不能省略
 *  * * 当(形参列表)是空参时，()不能省略
 *  */
public class LambdaTest {

    @Test
    public void testHelloWorld(){
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("helloworld");
            }
        };
        new Thread(runnable).start();

        new Thread(()->{System.out.println("helloworld");}).start();
    }

    @Test
    public void testList(){
        List<String> list = Arrays.asList("张三", "李四", "王五", "赵六", "田七");
        for (String s : list) {
            System.out.println(s);
        }
        System.out.println("+++++++++++++++++++++++++++++++++++++++++");
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        System.out.println("+++++++++++++++++++++++++++++++++++++++++");
        list.forEach((String s)->{System.out.println(s);});
        System.out.println("+++++++++++++++++++++++++++++++++++++++++");
        list.forEach(s->{System.out.println(s);});
    }

    @Test
    public void testCalculator(){
        testCalc(1, 2, (a, b)->a+b);
        testCalc(2, 4, (a, b)->a*b);
    }

    public void testCalc(int a, int b, Calculator calculator){
        System.out.println(calculator.calc(a, b));
    }

}
